//
#include<iostream>
#include<string>
using namespace std;



struct ListNode {
    int val;
    ListNode* next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode* next) : val(x), next(next) {}
};
 
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* pre = new ListNode(0,head);
        ListNode* origin = pre;
        ListNode* i = head;
        int t = 0;
        while (i != nullptr) {

            if (t>=n){
                pre = pre->next;
            }
            i = i->next;
            t = t + 1;
        }
        pre->next = pre->next->next;
        return origin->next;

    }
};
//
//
//int main() {
//    ListNode pre(0);
//    ListNode p1(1);
//    ListNode p2(2);
//    ListNode p3(3);
//    ListNode p4(4);
//    ListNode p5(5);
//
//    pre.next = &p1;
//    p1.next = &p2;
//    p2.next = &p3;
//    p3.next = &p4;
//    p4.next = &p5;
//
//    Solution S;
//    ListNode* head = S.removeNthFromEnd(&p1,2);
//    while (head) {
//        cout << head->val << endl;
//        head = head->next;
//    }
//
//    
//}